package cc.bookcloud.tool.ocr.common.parsetext;

import cn.hutool.core.lang.Validator;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import cc.bookcloud.tool.ocr.util.StringUtil;
import cc.bookcloud.tool.ocr.util.ocr.OcrTextParseUtil;
import lombok.Data;


/**
 * @Desc: @todo
 * @Version: 2.0
 * @Author: John Goo
 * @Date: 2024/11/26 09:15
 **/
@Data
public class TrainTicketParseEntity extends OcrTextParseAbstract{

    // 火车票红色编码
    private String ticketNo;
    // 乘车时间
    private String departureDate;
    // 座位号
    private String seatNo;
    // 座位类别(级别）
    private String seatLevel;
    // 出发地
    private String departureStation;
    // 车次号
    private String trainNumber;
    // 目的地
    private String arrivalStation;
    // 价格
    private String ticketPrice;
    // 检票口
    private String check;
    // 乘客身份证号
    private String identNo;
    // 乘客名称
    private String passengerName;
    // 火车票ID
    private String ticketId;

    @Override
    public void type() {
        super.type = "train_ticket";
        super.typeDesc="火车票";

    }


    public Boolean ticketNo(String text, Integer pos, JSONArray row){
        Boolean flag = false;
        // 解析ticketNo
         // 预定位置 0，1
        if(pos <= 1){
            // 首字母大写且后接数字
           // char first = text.charAt(0);
            //boolean isUpper = Character.isUpperCase(first);
            boolean isUpperLetter = OcrTextParseUtil.isTrainTicketNo(pos,text);
            // 长度 5-12位
            int len = text.length();
            if(len>=5 && len<=12 && isUpperLetter){
                flag = true;
                this.ticketNo = text;
            }
        }
        return flag;
    }

    public Boolean departureDate(String text, Integer pos,JSONArray row){
        Boolean flag = false;
        //  乘车时间：最长17位&最短12 @todo不严谨
        if((text.contains(":")||text.contains("：")) && text.length() <= 18  && text.length() >= 12){
            flag = true;
            this.departureDate = text;
        }
        return flag;
    }

    public Boolean seatNo(String text, Integer pos,JSONArray row){
        Boolean flag = false;
        // 座位号: 包含车且号-最后号结尾      12车04B号
        if(text.contains("车") && text.contains("号") ){
            flag = true;
            this.seatNo = text;
        }
        return flag;
    }
    public Boolean seatLevel(String text, Integer pos,JSONArray row){
        Boolean flag = false;
        // 座位号: 最后以‘座’结尾      二等座
        if(text.lastIndexOf("座") != -1){
            flag = true;
            this.seatLevel = text;
        }
        return flag;
    }
    public Boolean departureStation(String text, Integer pos,JSONArray row){
        // 出发地
        return false;
    }
    public Boolean trainNumber(String text, Integer pos,JSONArray row){
        // 解析ticketNo
        return false;
    }
    public Boolean arrivalStation(String text, Integer pos,JSONArray row){
        // 目地的站点
        Boolean flag = false;
        // 位置范围
        if(pos >= 3 && pos <10 ){
            // 特征匹配，前移两位
           JSONObject rw1 = row.getJSONObject(pos+1);
           JSONObject rw2 = row.getJSONObject(pos+2);
           String s1 = rw1.getString("text");
           String s2 = rw2.getString("text");
            s1 = s1.replace("'","");
            s2 = s2.replace("'","");

           // 两个站名：拼音
           if( isPinyinStation(s1) && isPinyinStation(s2)){
               flag = true;

               // 车次与车站之间有三种情况-前、中、后
               // 后移两位
               JSONObject af1 = row.getJSONObject(pos-1);
               JSONObject af2 = row.getJSONObject(pos-2);
               // 去掉特殊字符'
               String n1 = af1.getString("text");
               String n2 = af2.getString("text");

               /********** 车次最后情形（1） *******/
               if( isTrainNumber(text) ){
                   this.trainNumber = text;
                   this.departureStation = n2;
                   this.arrivalStation = n1;
                   // 文件格式内容
               }

               /********** 车次最后情形（2） *******/
               // 中间情形
               if( isTrainNumber(n1) ){
                   this.trainNumber = n1;
                   this.departureStation = n2;
                   this.arrivalStation = text;
               }



               /********** 车次最后情形（3） *******/
               // 中间情形
               if( isTrainNumber(n2) ){
                   this.trainNumber = n2;
                   this.departureStation = n1;
                   this.arrivalStation = text;
               }


//               // 解析内容 ：出发地、车次、目的地
//               this.arrivalStation = text;
//
//               // 判断是否车次
//               if( isTrainNumber(n1) ){
//                   this.trainNumber = n1;
//                   this.departureStation = n2;
//               }
//               // 位置匹配法
//               if(isTrainNumber(n2)){
//                   this.trainNumber = n2;
//                   this.departureStation = n1;
//               }
           }
        }
        return flag;
    }


    public Boolean ticketPrice(String text, Integer pos,JSONArray row){
        Boolean flag = false;
        // 车票金额 ,包含￥
        if(text.contains("￥")  ){
            flag = true;
            this.ticketPrice = text;
        }
        return flag;
    }

    public Boolean check(String text, Integer pos,JSONArray row){
        Boolean flag = false;
        // 检票口,包含‘检票口’
        if(text.contains("检票")  ){
            flag = true;
            this.check = text;
        }
        return flag;
    }


    public Boolean identNo(String text, Integer pos,JSONArray row){
        Boolean flag = false;
        // 身份证,包含‘***’
        if(text.contains("**")  ){
            flag = true;
            this.identNo = text;
            // 解析姓名
            /**情况一：在身份证后面*/
            String temp = identNo;
            // 最后一位
            if(super.isIncludeChinese(text) ){
                // 有汉字-代表姓名拼接在后面
                char[] array =  text.toCharArray();
                String name = "";
                for(int i=array.length-1; i>0; i--){
                    char v = array[i];
                    if(isIncludeChinese(String.valueOf(v))){
                        name = v + name;
                    }else{
                        break;
                    }
                }
                // 设置姓名
                this.passengerName = name;
            }else{
                // H604402**       丁峰
                if(identNo.lastIndexOf("**") !=-1){
                    // 直接取下一位
                    this.passengerName =  row.getJSONObject(pos +1).getString("text");
                }else {
                    // 在身份证上方
                    this.passengerName = row.getJSONObject(pos - 2).getString("text");
                }
            }
        }

        return flag;
    }


    public Boolean passengerName(String text, Integer pos,JSONArray row){
        // 乘客姓名：在身份证上面或身份证背后
        return false;
    }
    public Boolean ticketId(String text, Integer pos,JSONArray row){
        Boolean flag = false;
        // 票据ID,统计大于20位，里面有一个大写的字母；在票据尾部（不一定是最后一位）
        if(text.length() > 20 && pos >= (row.size()-3)){
            this.ticketId = text;
            flag = true;

        }
        return flag;
    }

    public  boolean isPinyinStation(String str){
        // 首字母大写;全是字母;大于3位
        if(!StringUtil.isEmpty(str)
                && str.length()>=3
                && Validator.isWord(str)
                && Character.isUpperCase(str.charAt(0))){
            return true;
        }else{
            return false;
        }
    }
    public static boolean isTrainNumber(String str){
            if(StringUtil.isEmpty(str) || str.length()< 3){
                return false;
            }
            // 首字母大写
            char f = str.charAt(0);
            if(!Character.isUpperCase(f)){
                return false;
            }else{
                str = str.replace(String.valueOf(f),"");
                // 去掉首字母后面是数字
                if(str.lastIndexOf("次") != -1){
                    // 判断后面是否有次
                    str = str.replace("次","");
                }
                if(Validator.isNumber(str)){
                    return true;
                }else{
                    return false;
                }
            }

    }


    @Override
    public void initElementTemplate() {
       // super.elementTemplateList = new ArrayList<>();
        elementTemplateList.add(new OcrTextElementUnit("ticketNo","火车票红色编码","{}","1,2"));
        elementTemplateList.add(new OcrTextElementUnit("departureDate","乘车时间","{}","1,2"));
        elementTemplateList.add(new OcrTextElementUnit("seatNo","座位号","{}","1,2"));
        elementTemplateList.add(new OcrTextElementUnit("seatLevel","座位类别","{}","1,2"));
        elementTemplateList.add(new OcrTextElementUnit("departureStation","出发地","{}","1,2"));
        elementTemplateList.add(new OcrTextElementUnit("trainNumber","车次号","{}","1,2"));
        elementTemplateList.add(new OcrTextElementUnit("arrivalStation","目的地","{}","1,2"));
        elementTemplateList.add(new OcrTextElementUnit("ticketPrice","车票金额","{}","1,2"));
        elementTemplateList.add(new OcrTextElementUnit("check","检票口","{}","1,2"));
        elementTemplateList.add(new OcrTextElementUnit("identNo","乘客身份证号","{}","1,2"));
        elementTemplateList.add(new OcrTextElementUnit("passengerName","乘客名称","{}","1,2"));
        elementTemplateList.add(new OcrTextElementUnit("ticketId","火车票ID","{}","1,2"));

        // 转换成map对象
        elementTemplateList.forEach(item->{
            metaMap.put(item.getAttrName(),item);
        });
    }

    @Override
    public String[] eleTemplateArray() {
        return new String[0];
    }
}
